
import pylab as p
import math
from bpsk_modular_bits import modular_bits_en_bpsk
from funciones import generar_bits, sumar_ruido_gaussiano_blanco, detectar_bayesianamente


# Argumentos

mostrar_intermedios = True
mostrar_resultado = True

lambda_01 = 0.5
lambda_11 = 0.5
N = 1000
alpha_0 = 0
alpha_1 = math.pi
A = 1
L = 8 
sigma2_W = 1
P_0 = lambda_01
P_1 = lambda_11

C_W = sigma2_W * p.identity(L)


def mostrar_intermedio(titulo, elemento):
    if(mostrar_intermedios):
        print titulo
        print elemento
        print "longitud: " + str(len(elemento))
        print ""

generado = generar_bits(lambda_01, lambda_11, N)
mostrar_intermedio("Generado:", generado)

modulado = modular_bits_en_bpsk(generado, alpha_0, alpha_1, A, L)
mostrar_intermedio("Modulado:", modulado)

modulado_mas_ruido = sumar_ruido_gaussiano_blanco(modulado, sigma2_W)
mostrar_intermedio("Modulado con ruido:", modulado_mas_ruido)

detectado = []
error = []
for i in range(N):
    detectado_i = detectar_bayesianamente(modulado_mas_ruido[i * L:(i + 1) * L], A, alpha_0, alpha_1, C_W, P_0, P_1)
    detectado.append(detectado_i[0])
    error.append(detectado_i[1])
mostrar_intermedio("Detectado:", detectado)

contador = 0
for i in range(N):
    if (generado[i] != detectado[i]):
        contador += 1
        
if(mostrar_resultado):
    print "La tasa de error fue de:"
    print contador / float(N)
    print ""
    print "La probabilidad de error promedio es de:"
    print p.average(error)



